/**
 * 作者:hanbo
 * 日期:2018/11/1915:39
 * 描述:
 */
import {WebGL} from "../webgl/WebGL";
import uuidv1 from 'uuid/v1';

export class BaseBrush {
    /**
     * 构造器
     * @param webGL
     */
    constructor(webGL, VSHADER_SOURCE, FSHADER_SOURCE) {
        this._webGL = webGL;
        this.VSHADER_SOURCE = VSHADER_SOURCE;
        this.FSHADER_SOURCE = FSHADER_SOURCE;
        this.uuid = uuidv1();//唯一编号
    }

    /**
     * 设置所属图层的id
     * @param uuid {String} 所属图层的id
     */
    setLayer(uuid) {
        this.layer = uuid;
    }

    /**
     * 初始化顶点和片元着色器
     * @param VSHADER_SOURCE 顶点着色器
     * @param FSHADER_SOURCE 片元着色器
     * @private
     */
    initShaders() {
        let result = WebGL.initShaders(this._webGL, this.VSHADER_SOURCE, this.FSHADER_SOURCE);
        if (!result) {
            console.error('初始化着色器失败.');
        } else {
            this._program = result.program;
            this._vertexShader = result.vertexShader;
            this._fragmentShader = result.fragmentShader
        }
    }

    /**
     * 生成缓冲区
     * @param verticesColors
     * @returns {boolean}
     */
    createBuffer(data) {
        //如果缓冲区不存在，则新建缓冲区
        // if (!this._vertexColorBuffer) {
        // 创建缓冲区，每次使用都创建缓冲区
        this._vertexColorBuffer = this._webGL.createBuffer();

        if (!this._vertexColorBuffer) {
            console.log('生成缓冲区失败');
            return false;
        }
        //绑定缓冲区
        this._webGL.bindBuffer(this._webGL.ARRAY_BUFFER, this._vertexColorBuffer);
        // }
        //向缓冲区写入数据
        this._webGL.bufferData(this._webGL.ARRAY_BUFFER, data, this._webGL.STATIC_DRAW);
        this._webGL.flush();
    }

    /**
     * 清理WebGL占用
     */
    clear() {
        this._webGL.deleteBuffer(this._vertexColorBuffer);//删除缓冲区
        this._webGL.deleteShader(this._vertexShader);
        this._webGL.deleteShader(this._fragmentShader);
        this._webGL.deleteProgram(this._program);
    }

    /**
     * 绘制操作
     */
    draw(projection) {
        this.initShaders();//初始化program
        this.setMatrixPosition(projection);//设置投影矩阵
    }

    setMatrixPosition(projection) {
        let uMatrixLocation = this._webGL.getUniformLocation(this._program, "u_Matrix");
        this._webGL.uniformMatrix4fv(uMatrixLocation, false, projection);
    }


}